package com.shujia.duotai;

import org.junit.Test;

public class CutManTest {

    /*
    构造方法, 和多态没有直接的关联关系
    先执行父类的构造方法，可以帮助我们初始化父类的成员变量，
    然后在执行子类的构造方法中其他的代码来实现子类成员变量的初始化
     */
    @Test
    public void test4() {
        CutMan cutMan = new Barber();
    }

    /*
    静态成员
    编译看左边，运行看左边
    在多态中，不会继承静态方法，因为静态方法是属于类的。所以在多态中我们调用静态方法那么执行的也是父类中的静态方法
     */
    @Test
    public void test3() {
        CutMan cutMan = new Doctor();
        System.out.println(cutMan.height);
        cutMan.sleep();
    }

    @Test
    public void test2() {
        CutMan cutMan = new Actor();
        CutMan cutMan1 = new Doctor();
        CutMan cutMan2 = new Barber();
        cutMan.cut();
        cutMan1.cut();
        cutMan2.cut();
    }

    @Test
    public void test1() {
        CutMan cutMan = new Actor();
        System.out.println(cutMan.getHobby());
    }

    public static void main(String[] args) {
        /*
        父类引用指向子类的对象
        编译时类型：由声明变量的类型决定，等号左边
        运行时类型：由实际赋给该变量的对象决定，等号右边
         */
        CutMan cutMan = new Doctor();

        /*
         成员变量, 属性
         编译看左边: 是指左边的数据类型是否具有这个属性, 如果没有的话会报错
         运行看左边: 在编译通过的情况下, 最终代码调用的属性值是左边类型的属性值
         */
        System.out.println(cutMan.name);
        // System.out.println(cutMan.age);// 编译报错

        /*
        成员方法
        编译看左边: 因为CutMan类里面没有定义run方法,编译的时候会报错
        运行看右边: 方法在运行是, 调用的是子类的方法
        在多态中，因为方法存在重写 （覆盖），所以在访问的时候执行的是子类中重写的方法
         */
        cutMan.cut();


    }
}
